package indi.kider.server.apartment.service;

import indi.kider.common.model.apabus.RentOutline;
import indi.kider.common.model.apartment.Community;
import indi.kider.common.model.apartment.Houses;
import indi.kider.common.model.apartment.HousesMsg;
import indi.kider.common.model.bill.Meter;
import indi.kider.common.model.employee.Employee;
import indi.kider.server.apartment.model.City;
import indi.kider.server.apartment.model.CommunityTitle;
import indi.kider.server.apartment.model.HouseRent;
import indi.kider.server.apartment.model.HousesCommunityQuery;
import pers.vankid.common.model.base.CoreException;
import pers.vankid.common.utils.page.PageRequest;
import pers.vankid.common.utils.page.PageResponse;

import java.util.List;

public interface ApartmentService {

    /**
     * 根据用户查询城市大区信息
     *
     * @param enterpriseId
     * @return
     */
    List<City> queryCityByUserCode(Long enterpriseId);

    /**
     * 根据城市、大区查询公寓名称
     *
     * @param cityName
     * @param area
     * @return
     */
    List<Community> queryCommunityByArea(String cityName, String area,Long enterpriseId);

    /**
     * 根据房屋ID查询房屋的所以信息。
     *
     * @param housesId
     * @return
     */
    HousesMsg queryHouseById(Long housesId);

    /**
     * 根据小区ID查询小区信息
     *
     * @param id
     * @return
     */
    Community queryCommunityById(Long id);

    /**
     * 更新小区信息
     *
     * @param community
     * @return
     */
    int updateCommunity(Community community);

    /**
     * 新增加城市小区
     *
     * @param community
     * @return
     */
    int addCommunity(Community community);

    /**
     * 新增房屋
     *
     * @param houses
     * @return
     */
    Houses addHouse(Houses houses);

    /**
     * 新增房屋,同时根据添加人自动分配到所属企业中去
     *
     * @param houses
     * @param employee)
     * @return
     */
    RentOutline addHouse(Houses houses, Employee employee);
    /**
     * 更新房屋信息
     *
     * @param houses
     * @return
     */
    int updateHouse(Houses houses);

    /**
     * 更新房屋状态
     * @param houses
     */
    void updateHouseState(Houses houses);

    /**
     * 根据小区名称查询房屋
     *
     * @param community
     * @return
     */
    List<Houses> queryByArea(String community);

    /**
     * 根据小区ID查询房屋
     *
     * @param communityId
     * @return
     */
    List<Houses> queryByArea(Long communityId);

    /**
     * 根据communityId删除小区
     * <p>
     * 1、有使用的情况不让删除
     * 2、如果没有使用的情况可以删除
     * </p>
     *
     * @param communityId
     */
    void delCommunityById(Long communityId) throws CoreException;

    /**
     * 根据房屋ID删除
     *
     * @param houseId
     */
    void delHouseById(Long houseId) throws CoreException;

    /**
     * 判断这个小区是否有业务
     * <p>
     * 有使用业务 true
     * 没有使用业务 false
     * </p>
     *
     * @param communityId
     * @return
     */
    boolean hasBusOfThisCommunity(Long communityId);

    /**
     * 判断小区下是否存在房屋，有则不允许删除
     *
     * @param communityId
     * @return
     */
    boolean hasHousesOfThisCommunity(Long communityId);

    /**
     * 判断这房屋是否有业务
     * <p>
     * 有使用业务 true
     * 没有使用业务 false
     * </p>
     *
     * @param houseId
     * @return
     */
    int hasBusOfThisHouse(Long houseId);

    /**
     * 获取社区标题
     *
     * @param request
     * @return
     */
    PageResponse<CommunityTitle> getCommunityTitleList(PageRequest<HousesCommunityQuery> request);

    PageResponse<CommunityTitle> getCommunityListNew(PageRequest<HousesCommunityQuery> request);

    /**
     * 获取房屋标题
     *
     * @param request
     * @return
     */
    PageResponse<HouseRent> getHouseRentList(PageRequest<HousesCommunityQuery> request);


    PageResponse<List<HousesMsg>> selectHouseMsgByEnterprise(PageRequest<String>request);


    HouseRent addDefHouses(Long communitId,Long id,Employee employee);

    List<String> verifyTheDeviceIsUsed(List<String> meters, Integer meterType);


    /**
     * 1名称相同，2code相同
     *
     * @param community
     * @return
     */
    int checkNameAndNumber(Community community);


}
